home *** CD-ROM | disk | FTP | other *** search
/ BMUG PD-ROM A / PD-ROM A.iso / Programming / Programming Help / Alpha.4.01 / ACMDS / acmds.new / fill.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-20  |  2.7 KB  |  132 lines  |  [TEXT/ALFA]

  1. /* Fillit ACMD */
  2.  
  3. #define    TRUE    1
  4. #define    FALSE    0
  5. #define    NULL    0L
  6.  
  7. /* pointer to a function that returns an 'int' */
  8. typedef int      (*FPtr)();
  9. #define    MAX_LEFT    50
  10.  
  11. #undef    DEBUG
  12.  
  13.  
  14. char *
  15. #ifdef    DEBUG
  16. try(text, alert, getVar, setVar, defineVar,deleteVar)
  17. #else
  18. main(text, alert, getVar, setVar, defineVar,deleteVar)
  19. #endif    DEBUG
  20. char    *text;
  21. FPtr    getVar, setVar, defineVar, deleteVar, alert;
  22. {
  23.     register char        c, *fromPtr, *toPtr, *temp;
  24.     char                *mem, *lineStart;
  25.     long                sz,i,col, left = 0, right = 75;
  26.     register long        space;
  27.     char                spaces[MAX_LEFT];
  28.     int                    isCr = FALSE;
  29.     
  30. #ifndef    DEBUG
  31.     if (!getVar("fillColumn", &right) || !getVar("leftFillColumn", &left))
  32.     {
  33.         alert("Unable to access vars");
  34.         DisposPtr(text);
  35.         return NULL;
  36.     }
  37. #endif    DEBUG
  38.     if (left >= 50) { alert("'leftFillColumn' must be less than %ld!",MAX_LEFT); return text; }
  39.     for (i = 0; i < left; i++) spaces[i] = ' ';
  40.     spaces[left] = 0;
  41.     sz = GetPtrSize(text);
  42.     
  43.     /* preserve the last CR if there is one */
  44.     for (toPtr = text; *toPtr; toPtr++);
  45.     if (*(toPtr - 1) == '\r') { *(toPtr-1) = 0; isCr = TRUE; }
  46.     
  47.     sz += ((sz / right) + 1) * (1 + left) + 5;
  48.     if (!(mem = toPtr = NewPtrClear((long)sz)))
  49.     {
  50.         alert("Out of memory");
  51.         return text;
  52.     }
  53.     
  54.     /* 
  55.        Copy everything into the new block. Then, copy it back into the old block while
  56.        elimanating CRs and duplicate white space. Finally, copy back into the new block
  57.        adding CRs and new white space as required by 'leftFillColumn'
  58.      */
  59.     memmove(mem, text, (long)sz);
  60.     mem[sz-1] = 0;
  61.     
  62.     toPtr = text; fromPtr = mem; space = TRUE;
  63.     while (c = *fromPtr++)
  64.     {
  65.         if ((c == ' ') || (c == '\t') || (c == '\r')) 
  66.         {
  67.             if (!space) 
  68.             {
  69.                 *toPtr++ = ' '; space = TRUE;
  70.             }
  71.         }
  72.         else
  73.         {
  74.             *toPtr++ = c; space = FALSE;
  75.         }
  76.     }
  77.     *toPtr = 0;
  78.  
  79.     /* last pass, add in extra spaces and CRs */
  80.     fromPtr = text; toPtr = mem; col = 0;
  81.     while (*fromPtr)
  82.     {
  83.         col = left;
  84.         strcpy(toPtr, spaces); 
  85.         toPtr += left;
  86.         lineStart = fromPtr;
  87.         
  88.         while ((col < right) && (*toPtr++ = *fromPtr++)) col++;
  89.         if (!*(toPtr - 1)) { toPtr--; break; }
  90.  
  91.         for (temp = fromPtr; (*temp != ' ') && (temp > lineStart); temp--);
  92.         if (temp <= lineStart)
  93.         {
  94.             /* just have to leave an overlong line */
  95.             while ((*fromPtr != ' ') && *fromPtr) *toPtr++ = *fromPtr++;
  96.             fromPtr++; *toPtr++ = '\r';
  97.         }
  98.         else
  99.         {
  100.             toPtr -= (fromPtr - temp);
  101.             *toPtr++ = '\r';
  102.             fromPtr = temp + 1;
  103.         }
  104.     }
  105.     if (isCr) *toPtr++ = '\r';
  106.     *toPtr = 0;
  107.  
  108.     if (toPtr > (mem + sz))
  109.     {
  110.         alert("Whoops, you better quit fast");
  111.         return text;
  112.     }
  113.  
  114.     /* clean up */
  115.     DisposPtr(text);
  116.     return mem;
  117. }
  118.  
  119.  
  120. #ifdef    DEBUG
  121. main()
  122. {
  123.     char    *text = "(ascii 28 <c> scrollLeftCol)\r(ascii 29 <c> scrollRightCol)";
  124.     char    *ptr;
  125.     
  126.     ptr = NewPtr(200);
  127.     memmove(ptr, text, 200L);
  128.     try(ptr);
  129. }
  130. #endif    DEBUG
  131.  
  132.